package org.dreamwork.modbus.tcp;

import org.dreamwork.modbus.ModbusException;
import org.dreamwork.modbus.Predefined;
import org.dreamwork.modbus.protocol.PDU;

public interface IServerHandler {
    int[] EMPTY_ARRAY_OF_INT = {};
    boolean[] EMPTY_ARRAY_OF_BOOLEAN = {};

    /**
     * 当服务器接收到一个读线圈状态的请求时触发
     * @param address 线圈起始地址
     * @param count   线圈个数
     * @return 线圈状态数组
     * @throws ModbusException 任何modbus异常
     */
    default boolean[] onReadCoils (int address, int count) throws ModbusException {
        return EMPTY_ARRAY_OF_BOOLEAN;
    }

    /**
     * 当服务器接收到一个读离散量状态的请求时触发
     * @param address 离散量起始地址
     * @param count   离散量个数
     * @return 离散量状态数组
     * @throws ModbusException 任何modbus异常
     */
    default boolean[] onReadDiscreteInputs (int address, int count) throws ModbusException {
        return EMPTY_ARRAY_OF_BOOLEAN;
    }

    /**
     * 当服务器接收到一个读保持寄存器的请求时触发
     * @param address 保持寄存器起始地址
     * @param count   保持寄存器个数
     * @return 保持寄存器值数组
     * @throws ModbusException 任何modbus异常
     */
    default int[] onReadHoldingRegisters (int address, int count) throws ModbusException {
        return EMPTY_ARRAY_OF_INT;
    }

    /**
     * 当服务器接收到一个读输入寄存器的请求时触发
     * @param address 输入寄存器起始地址
     * @param count   输入寄存器个数
     * @return 输入寄存器值数组
     * @throws ModbusException 任何modbus异常
     */
    default int[] onReadInputRegisters (int address, int count) throws ModbusException {
        return EMPTY_ARRAY_OF_INT;
    }

    /**
     * 当服务器接收到一个写单个线圈的请求时触发
     * @param address 线圈地址
     * @param value   线圈状态
     * @throws ModbusException 任何modbus异常
     */
    default void onWriteSingleCoil (int address, boolean value) throws ModbusException {}

    /**
     * 当服务器接收到一个写单个寄存器的请求时触发
     * @param address 寄存器地址
     * @param value   值
     * @throws ModbusException 任何modbus异常
     */
    default void onWriteSingleRegister (int address, int value) throws ModbusException {}

    /**
     * 当服务器接收到一个写多个线圈的请求时触发
     * @param address 线圈起始地址
     * @param values  线圈状态数组
     * @throws ModbusException 任何modbus异常
     */
    default void onWriteMultipleCoils (int address, boolean[] values) throws ModbusException {}

    /**
     * 当服务器接收到一个写多个寄存器的请求时触发
     * @param address 寄存器起始地址
     * @param values  值数组
     * @throws ModbusException 任何modbus异常
     */
    default void onWriteMultipleRegisters (int address, int[] values) throws ModbusException {}

    /**
     * 当服务器接收到一个 获取异常状态 的请求时触发。 仅 {@code 串行链路} 有效
     * @return 异常状态数组
     * @throws ModbusException 任何 modbus 异常
     */
    default boolean[] onReadExceptionStatus () throws ModbusException {
        return EMPTY_ARRAY_OF_BOOLEAN;
    }

    /**
     * 当服务器接收到一个 获取服务器诊断信息 的请求时触发，仅 {@code 串行链路} 有效
     * @throws ModbusException 任何 modbus 异常
     */
    default void onDiagnostics () throws ModbusException {
        throw new ModbusException (Predefined.Exception.SERVER_DEVICE_FAILURE, 0);
    }

    /**
     * 当收到一个 {@code 未知的} 功能码时，完全自定义处理请求
     * @param pdu modbus request pdu
     * @return modbus response pdu
     * @throws ModbusException 任何 modbus 异常
     */
    default PDU handleRawData (PDU pdu) throws ModbusException {
        return null;
    }
}